package com.library.service.admin;

import com.library.dao.BookCopyDao;
import com.library.dao.BookManageDao;
import com.library.entity.Bookcopy;
import com.library.entity.po.BookCopyPO;
import com.library.entity.po.PagePO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.regex.Pattern;

public class BookCopyService {

    private final BookCopyDao bookCopyDao = new BookCopyDao();
    private final BookManageDao bookManageDao = new BookManageDao();

    /**
     * 验证条码号格式是否有效
     * @param barCode 条码号
     * @return 是否有效
     */
    public boolean isValidBarCode(String barCode) {
        if (barCode == null || barCode.trim().isEmpty()) {
            return false;
        }
        // 条码号应为6-20位字母数字组合
        Pattern pattern = Pattern.compile("^[A-Za-z0-9]{6,20}$");
        return pattern.matcher(barCode.trim()).matches();
    }

    /**
     * 检查书籍是否可用于创建副本（书籍存在且已上架）
     * @param isbn ISBN号
     * @return 是否可用
     */
    public boolean isBookAvailableForCopy(String isbn) {
        return bookManageDao.isBookAvailableForCopy(isbn);
    }

    /**
     * 添加书籍副本
     * @param bookcopy 副本对象
     * @return 是否成功
     */
    public boolean addBookcopy(Bookcopy bookcopy) {
        // 检查条码号是否已存在
        if (bookCopyDao.isbarcodexists(bookcopy.getBarCode())) {
            return false;
        }
        return bookCopyDao.addBookCopy(bookcopy);
    }

    /**
     * 分页查询书籍副本
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @param keyword 搜索关键词
     * @param request 请求对象
     * @return 分页结果
     */
    public PagePO<BookCopyPO> pageBookCopy(int pageNum, int pageSize, String keyword, HttpServletRequest request) {
        List<BookCopyPO> list = bookCopyDao.pageBookcopy(pageNum, pageSize, keyword);
        Long totalCount = bookCopyDao.countBookcopy(keyword);

        PagePO<BookCopyPO> pagePO = new PagePO<>();
        pagePO.setList(list);
        pagePO.setPageNum(pageNum);
        pagePO.setPageSize(pageSize);
        pagePO.setTotalCount(totalCount);

        // 计算总页数
        int totalPage = (int) Math.ceil((double) totalCount / pageSize);
        pagePO.setTotalPage(totalPage);

        return pagePO;
    }

    /**
     * 更新书籍副本
     * @param barCode 条码号
     * @param place 位置
     * @param status 状态
     * @return 是否成功
     */
    public boolean updateBookCopy(String barCode, String place, Integer status) {
        return bookCopyDao.updateBookCopy(barCode, place, status);
    }

    /**
     * 根据条码号获取副本信息
     * @param barCode 条码号
     * @return 副本信息
     */
    public Bookcopy getBookCopyByBarCode(String barCode) {
        return bookCopyDao.getBookCopyByBarCode(barCode);
    }

    /**
     * 注销单个书籍副本
     * @param barCode 条码号
     * @return 是否成功
     */
    public boolean cancelBookCopy(String barCode) {
        // 检查副本是否存在且未借出
        Bookcopy existingCopy = bookCopyDao.getBookCopyByBarCode(barCode);
        if (existingCopy == null || existingCopy.getStatus() == 0) {
            return false; // 不存在或已借出，不能注销
        }

        // 将状态更新为2（注销）
        return bookCopyDao.updateBookCopyStatus(barCode, 2);
    }

    /**
     * 批量注销书籍副本
     * @param barCodes 条码号数组
     * @return 是否成功
     */
    public boolean batchCancelBookCopy(String[] barCodes) {
        // 批量更新状态为2（注销），但不能注销已借出的副本
        return bookCopyDao.batchUpdateBookCopyStatus(barCodes, 2);
    }
}